lorem
Figure 1.1: Ilustrasi berjudul “Random Forest Logistics on Support Vector” yang dibuat oleh AI menggunakan PixAI
Dalam perkuliahan, kesehatan mahasiswa harus dijaga untuk pembelajaran optimal. Menurut penelitian dari Pratama and Nur Zaimah (2024), melakukan aktivitas fisik dapat mengurangi tingkat kecemasan, depresi, serta meningkatkan suasana hati dan fungsi kognitif. Selain kesehatan fisik, kesehatan mental juga perlu diperhatikan dikarenakan kontribusinya terhadap perkembangan dan kesuksesan pola pikir mahasiswa yang bukan hanya berpengaruh secara individual, namun juga dalam kelompok.
Analisis terhadap data kesehatan mampu mendeteksi pola keseharian mahasiswa melalui berbagai faktor dan dapat menentukan tingkat risiko kesehatan mereka. Proses pengambilan keputusan berbasis data dapat menjadi acuan institusi pendidikan untuk meningkatkan kesejahteraan peserta didiknya.
Dengan perkembangan teknologi yang begitu pesat akhir-akhir ini, kecerdasan buatan telah melampaui batas yang semula sulit diraih. Dari membuat makalah lengkap yang terstruktur hingga gambar yang menyerupai lukisan, seperti contoh gambar pada Figure 1.1, kecerdasan buatan telah menjadi alat untuk membantu manusia mencapai tujuannya. Semua ini berawal dari data yang dipilih dan diolah, yang kemudian dijadikan bahan latihan untuk komputer agar mampu mengambil keputusan yang tepat. Inilah inti dari pembelajaran mesin, atau disebut machine learning.
Penggunaan teknik dan model pembelajaran mesin terhadap data kesehatan mahasiswa diharapkan dapat membantu mengidentifikasi tanda-tanda risiko pada masing-masing individu. Pembelajaran mesin terutama bermanfaat untuk mengenali pola pada data dengan banyak variabel dengan beragam karakteristik, baik linear, polinomial, eksponensial, maupun fluktuatif. Hasil pengenalan ini nantinya membentuk suatu model yang akan digunakan untuk memprediksi kasus-kasus baru yang belum pernah ditemui sebelumnya. Dengan informasi baru yang didapat, intervensi maupun pencegahan dapat dilakukan oleh pihak terkait.
Tujuan dari laporan ini adalah sebagai latihan penulis dalam mengeksplorasi data, memprosesnya sebagai bahan untuk pembelajaran mesin, dan menentukan algoritma dan parameter yang tepat untuk melatih mesin agar mampu memprediksi hasil dengan akurat dan efisien. Semua tahapan ini dijalankan menggunakan bahasa pemrograman R.
Laporan ini terbagi menjadi beberapa bagian, selain dari bagian ini. Bagian 2 akan membahas tentang data yang digunakan, pengolahan data untuk eksplorasi data, dan pengolahan data untuk pembelajaran mesin. Bagian 3 akan membahas tentang model pembelajaran mesin yang digunakan, parameter yang ditetapkan, serta langkah evaluasi model. Bagian 4 akan membahas tentang performa model dan menetapkan model terbaik. Bagian 5 berisikan kesimpulan dari hasil temuan, keterbatasan, serta saran untuk penelitian ke depannya.
Dalam laporan ini, penulis mengacu pada dataset kesehatan dan kehadiran mahasiswa yang disediakan oleh Ziya (2024).
Dataset disediakan dalam bentuk file CSV, dan proses membaca file dapat dilakukan dengan mudah. Dalam dataset tersebut, terdapat dua file CSV yang identik. Berikut perintah bash untuk mengecek kesamaan file.
cd "Student Health and Attendance Data/"
sha1sum *
## 4ab8799345531cc7978909b88ae6bb6c5209e2fc student_monnitoring_data.csv
## 4ab8799345531cc7978909b88ae6bb6c5209e2fc student_tracking_data.csv
Kedua file sama, jadi cukup satu yang digunakan, yaitu student_monnitoring_data.csv.
data <- read.csv("Student Health and Attendance Data/student_monnitoring_data.csv")
Lihat Tabel 2.1 untuk 10 data pertama dan Tabel 2.2 untuk 10 data terakhir dari dataset.
| Student.ID | Date | Class.Time | Attendance.Status | Stress.Level..GSR. | Sleep.Hours | Anxiety.Level | Mood.Score | Risk.Level |
|---|---|---|---|---|---|---|---|---|
| 1 | 2024-12-01 | 9:00-15:00 | Late | 0.92 | 7.6 | 6 | 6 | Low |
| 1 | 2024-12-02 | 8:00-16:00 | Late | 1.17 | 6.0 | 6 | 2 | Medium |
| 1 | 2024-12-03 | 11:00-14:00 | Late | 4.56 | 6.3 | 4 | 8 | High |
| 1 | 2024-12-04 | 11:00-16:00 | Late | 3.07 | 9.0 | 2 | 10 | Low |
| 1 | 2024-12-05 | 9:00-13:00 | Absent | 3.93 | 7.4 | 9 | 4 | High |
| 1 | 2024-12-06 | 8:00-14:00 | Present | 4.96 | 6.6 | 5 | 9 | High |
| 1 | 2024-12-07 | 11:00-15:00 | Absent | 2.93 | 6.8 | 4 | 5 | High |
| 1 | 2024-12-08 | 8:00-15:00 | Absent | 2.17 | 8.4 | 9 | 9 | High |
| 1 | 2024-12-09 | 11:00-13:00 | Absent | 4.40 | 5.9 | 4 | 4 | High |
| 1 | 2024-12-10 | 9:00-16:00 | Late | 1.44 | 7.7 | 3 | 7 | Low |
| Student.ID | Date | Class.Time | Attendance.Status | Stress.Level..GSR. | Sleep.Hours | Anxiety.Level | Mood.Score | Risk.Level | |
|---|---|---|---|---|---|---|---|---|---|
| 14991 | 500 | 2024-12-21 | 8:00-16:00 | Present | 3.82 | 6.7 | 6 | 9 | High |
| 14992 | 500 | 2024-12-22 | 9:00-12:00 | Present | 4.76 | 6.9 | 4 | 10 | High |
| 14993 | 500 | 2024-12-23 | 8:00-12:00 | Absent | 2.03 | 7.4 | 8 | 7 | High |
| 14994 | 500 | 2024-12-24 | 10:00-12:00 | Present | 1.86 | 5.5 | 2 | 1 | Medium |
| 14995 | 500 | 2024-12-25 | 11:00-12:00 | Absent | 3.89 | 5.2 | 3 | 2 | High |
| 14996 | 500 | 2024-12-26 | 9:00-16:00 | Late | 1.30 | 7.2 | 7 | 10 | Low |
| 14997 | 500 | 2024-12-27 | 9:00-15:00 | Absent | 1.07 | 7.9 | 4 | 6 | High |
| 14998 | 500 | 2024-12-28 | 11:00-14:00 | Absent | 1.67 | 7.2 | 3 | 5 | High |
| 14999 | 500 | 2024-12-29 | 11:00-14:00 | Late | 0.99 | 7.2 | 10 | 9 | Medium |
| 15000 | 500 | 2024-12-30 | 9:00-16:00 | Present | 4.50 | 5.2 | 1 | 4 | High |
Tabel 2.3 dan 2.4 memberikan gambaran bentuk data apa adanya dari file CSV.
| Student.ID | Stress.Level..GSR. | Sleep.Hours | Anxiety.Level | Mood.Score | |
|---|---|---|---|---|---|
| Min. : 1.0 | Min. :0.500 | Min. :5.000 | Min. : 1.000 | Min. : 1.000 | |
| 1st Qu.:125.8 | 1st Qu.:1.640 | 1st Qu.:6.000 | 1st Qu.: 3.000 | 1st Qu.: 3.000 | |
| Median :250.5 | Median :2.760 | Median :7.000 | Median : 6.000 | Median : 5.000 | |
| Mean :250.5 | Mean :2.763 | Mean :6.997 | Mean : 5.547 | Mean : 5.472 | |
| 3rd Qu.:375.2 | 3rd Qu.:3.900 | 3rd Qu.:8.000 | 3rd Qu.: 8.000 | 3rd Qu.: 8.000 | |
| Max. :500.0 | Max. :5.000 | Max. :9.000 | Max. :10.000 | Max. :10.000 |
| Date | Class.Time | Attendance.Status | Risk.Level | |
|---|---|---|---|---|
| Length:15000 | Length:15000 | Length:15000 | Length:15000 | |
| Class :character | Class :character | Class :character | Class :character | |
| Mode :character | Mode :character | Mode :character | Mode :character |
Langkah selanjutnya adalah memastikan tidak ada baris kosong dalam dataset. Banyak baris kosong dapat diketahui dengan perintah berikut:
sum(is.na(data))
## [1] 0
Tidak ada data kosong dalam dataset, sehingga tidak perlu dibersihkan.
Untuk mempermudah eksplorasi dan pengolahan data lebih lanjut, data di atas diproses dengan mengubah tipe data:
Selain itu, terdapat data yang ditambahkan:
new_data <- data |>
mutate(
Student.ID = Student.ID |> as.integer(),
Date = Date |> as.Date(format = "%Y-%m-%d"),
Start.Time = Class.Time |> as.character() |> strsplit("-") |> sapply(\(x) x[1]),
Start.Time = paste(Date, Start.Time) |> as.POSIXct(format = "%Y-%m-%d %H:%M"),
Start.Hour = Start.Time |> format("%H") |> as.numeric(),
End.Time = Class.Time |> as.character() |> strsplit("-") |> sapply(\(x) x[2]),
End.Time = paste(Date, End.Time) |> as.POSIXct(format = "%Y-%m-%d %H:%M"),
End.Hour = End.Time |> format("%H") |> as.numeric(),
Class.Duration = (End.Time - Start.Time) |> as.numeric(),
Stress.Level..GSR. = Stress.Level..GSR. |> as.numeric(),
Sleep.Hours = Sleep.Hours |> as.numeric(),
Anxiety.Level = Anxiety.Level |> as.numeric(),
Mood.Score = Mood.Score |> as.numeric(),
Attendance.Status = Attendance.Status |> as.factor() |> recode_factor(
"1" = "Present",
"2" = "Late",
"3" = "Absent"
),
Risk.Level = Risk.Level |> as.factor() |> recode_factor(
"1" = "Low",
"2" = "Medium",
"3" = "High"
),
.keep = "none"
)
Berikut penjelasan dari perubahan di atas:
|>, yang dikenalkan sejak R versi 4.1.Berikut Tabel 2.5 untuk 10 data pertama dan Tabel 2.6 untuk 10 data terakhir dari dataset yang diubah. Hanya kolom tertentu yang ditampilkan karena keterbatasan ruang.
| Student.ID | Start.Time | Start.Hour | End.Time | End.Hour | Class.Duration | Attendance.Status | Risk.Level |
|---|---|---|---|---|---|---|---|
| 1 | 2024-12-01 09:00:00 | 9 | 2024-12-01 15:00:00 | 15 | 6 | Late | Low |
| 1 | 2024-12-02 08:00:00 | 8 | 2024-12-02 16:00:00 | 16 | 8 | Late | Medium |
| 1 | 2024-12-03 11:00:00 | 11 | 2024-12-03 14:00:00 | 14 | 3 | Late | High |
| 1 | 2024-12-04 11:00:00 | 11 | 2024-12-04 16:00:00 | 16 | 5 | Late | Low |
| 1 | 2024-12-05 09:00:00 | 9 | 2024-12-05 13:00:00 | 13 | 4 | Absent | High |
| 1 | 2024-12-06 08:00:00 | 8 | 2024-12-06 14:00:00 | 14 | 6 | Present | High |
| 1 | 2024-12-07 11:00:00 | 11 | 2024-12-07 15:00:00 | 15 | 4 | Absent | High |
| 1 | 2024-12-08 08:00:00 | 8 | 2024-12-08 15:00:00 | 15 | 7 | Absent | High |
| 1 | 2024-12-09 11:00:00 | 11 | 2024-12-09 13:00:00 | 13 | 2 | Absent | High |
| 1 | 2024-12-10 09:00:00 | 9 | 2024-12-10 16:00:00 | 16 | 7 | Late | Low |
| Student.ID | Start.Time | Start.Hour | End.Time | End.Hour | Class.Duration | Attendance.Status | Risk.Level | |
|---|---|---|---|---|---|---|---|---|
| 14991 | 500 | 2024-12-21 08:00:00 | 8 | 2024-12-21 16:00:00 | 16 | 8 | Present | High |
| 14992 | 500 | 2024-12-22 09:00:00 | 9 | 2024-12-22 12:00:00 | 12 | 3 | Present | High |
| 14993 | 500 | 2024-12-23 08:00:00 | 8 | 2024-12-23 12:00:00 | 12 | 4 | Absent | High |
| 14994 | 500 | 2024-12-24 10:00:00 | 10 | 2024-12-24 12:00:00 | 12 | 2 | Present | Medium |
| 14995 | 500 | 2024-12-25 11:00:00 | 11 | 2024-12-25 12:00:00 | 12 | 1 | Absent | High |
| 14996 | 500 | 2024-12-26 09:00:00 | 9 | 2024-12-26 16:00:00 | 16 | 7 | Late | Low |
| 14997 | 500 | 2024-12-27 09:00:00 | 9 | 2024-12-27 15:00:00 | 15 | 6 | Absent | High |
| 14998 | 500 | 2024-12-28 11:00:00 | 11 | 2024-12-28 14:00:00 | 14 | 3 | Absent | High |
| 14999 | 500 | 2024-12-29 11:00:00 | 11 | 2024-12-29 14:00:00 | 14 | 3 | Late | Medium |
| 15000 | 500 | 2024-12-30 09:00:00 | 9 | 2024-12-30 16:00:00 | 16 | 7 | Present | High |
Tabel 2.7 dan 2.8 memberikan gambaran bentuk data setelah diolah.
| Student.ID | Date | Start.Time | Start.Hour | End.Time | End.Hour | |
|---|---|---|---|---|---|---|
| Min. : 1.0 | Min. :2024-12-01 | Min. :2024-12-01 08:00:00 | Min. : 8.000 | Min. :2024-12-01 12:00:00.00 | Min. :12 | |
| 1st Qu.:125.8 | 1st Qu.:2024-12-08 | 1st Qu.:2024-12-08 10:00:00 | 1st Qu.: 8.000 | 1st Qu.:2024-12-08 14:00:00.00 | 1st Qu.:13 | |
| Median :250.5 | Median :2024-12-15 | Median :2024-12-15 21:30:00 | Median : 9.000 | Median :2024-12-16 02:00:00.00 | Median :14 | |
| Mean :250.5 | Mean :2024-12-15 | Mean :2024-12-15 21:30:06 | Mean : 9.502 | Mean :2024-12-16 01:59:48.24 | Mean :14 | |
| 3rd Qu.:375.2 | 3rd Qu.:2024-12-23 | 3rd Qu.:2024-12-23 09:00:00 | 3rd Qu.:11.000 | 3rd Qu.:2024-12-23 14:00:00.00 | 3rd Qu.:15 | |
| Max. :500.0 | Max. :2024-12-30 | Max. :2024-12-30 11:00:00 | Max. :11.000 | Max. :2024-12-30 16:00:00.00 | Max. :16 |
| Class.Duration | Stress.Level..GSR. | Sleep.Hours | Anxiety.Level | Mood.Score | Attendance.Status | Risk.Level | |
|---|---|---|---|---|---|---|---|
| Min. :1.000 | Min. :0.500 | Min. :5.000 | Min. : 1.000 | Min. : 1.000 | Present:4966 | Low :3271 | |
| 1st Qu.:3.000 | 1st Qu.:1.640 | 1st Qu.:6.000 | 1st Qu.: 3.000 | 1st Qu.: 3.000 | Late :5032 | Medium:3349 | |
| Median :5.000 | Median :2.760 | Median :7.000 | Median : 6.000 | Median : 5.000 | Absent :5002 | High :8380 | |
| Mean :4.495 | Mean :2.763 | Mean :6.997 | Mean : 5.547 | Mean : 5.472 | |||
| 3rd Qu.:6.000 | 3rd Qu.:3.900 | 3rd Qu.:8.000 | 3rd Qu.: 8.000 | 3rd Qu.: 8.000 | |||
| Max. :8.000 | Max. :5.000 | Max. :9.000 | Max. :10.000 | Max. :10.000 |
Sebelum menerapkan metodologi berikutnya, ada baiknya suatu data dipahami terlebih dahulu melalui proses eksplorasi data. Eksplorasi data bertujuan untuk memahami data dengan lebih baik sebelum diproses dalam tahapan analisis lebih lanjut (Ramdani & Utami, 2024). Dalam sains data, tahapan ini juga dikenal sebagai Exploratory Data Analysis (EDA), yaitu seperangkat alat yang digunakan untuk memahami sifat, struktur, dan distribusi data, serta melihat hubungan antara beberapa atribut dalam dataset.
Terdapat beberapa hal yang ingin penulis ketahui dalam data ini, di antaranya:
| Date | Present | Late | Absent | Total |
|---|---|---|---|---|
| 2024-12-01 | 164 | 177 | 159 | 500 |
| 2024-12-02 | 170 | 170 | 160 | 500 |
| 2024-12-03 | 138 | 192 | 170 | 500 |
| 2024-12-04 | 163 | 175 | 162 | 500 |
| 2024-12-05 | 167 | 168 | 165 | 500 |
Figure 2.1: Grafik Kehadiran Per Hari
| Attendance.Status | mean | median | stdev | min | range | max | skew | kurt |
|---|---|---|---|---|---|---|---|---|
| Absent | 166.73 | 167.0 | 9.79 | 149 | 37 | 186 | 0.17 | -0.61 |
| Late | 167.73 | 167.0 | 11.76 | 144 | 48 | 192 | -0.16 | -0.39 |
| Present | 165.53 | 166.5 | 10.64 | 138 | 51 | 189 | -0.23 | 0.00 |
Tingkat kehadiran, keterlambatan, dan absen relatif imbang hari ke hari. Banyak mahasiswa secara keseluruhan per hari pun konsisten. Ini berarti tidak ada banyak hubungan antara status kehadiran dan risiko kesehatan dengan pergerakan hari ke hari.
| Attendance.Status | Low | Medium | High |
|---|---|---|---|
| Present | 1585 | 1722 | 1659 |
| Late | 1686 | 1627 | 1719 |
| Absent | 0 | 0 | 5002 |
Figure 2.2: Grafik per Risiko Kesehatan
Grafik di atas menunjukkan tingkat risiko kesehatan tinggi jika mahasiswa tidak hadir pada kuliah hari itu.
Figure 2.3: Grafik Distribusi Atribut Numerik
Dari distribusi nilai di atas, terlihat bahwa waktu mulai kuliah dan tingkat stres memiliki hubungan terhadap tingkat risiko secara linier. Sementara itu, tingkat suasana hati dan kekhawatiran menunjukkan hubungan non-linier, dimana tingkat risiko menengah membentuk titik ekstrem di antara tingkat risiko yang lain. Untuk atribut yang lain, mereka menunjukkan hubungan konstan, atau hampir tidak ada hubungan dengan tingkat risiko.
Hubungan non-linier pada tingkat suasana hati dan kekhawatiran perlu dikaji lebih lanjut.
| AS | CD | SH | EH | SL | AL | MS | RL | |
|---|---|---|---|---|---|---|---|---|
| AS | 1.00 | 0.00 | 0.00 | 0.00 | -0.01 | 0.01 | -0.01 | 0.49 |
| CD | 0.00 | 1.00 | -0.02 | 0.79 | 0.00 | 0.01 | -0.01 | 0.01 |
| SH | 0.00 | -0.02 | 1.00 | -0.02 | 0.00 | -0.01 | -0.01 | 0.01 |
| EH | 0.00 | 0.79 | -0.02 | 1.00 | 0.00 | 0.00 | 0.00 | 0.00 |
| SL | -0.01 | 0.00 | 0.00 | 0.00 | 1.00 | 0.01 | -0.01 | 0.47 |
| AL | 0.01 | 0.01 | -0.01 | 0.00 | 0.01 | 1.00 | -0.01 | 0.16 |
| MS | -0.01 | -0.01 | -0.01 | 0.00 | -0.01 | -0.01 | 1.00 | -0.14 |
| RL | 0.49 | 0.01 | 0.01 | 0.00 | 0.47 | 0.16 | -0.14 | 1.00 |
Status kehadiran dan tingkat stres mahasiswa berperan besar terhadap tingginya risiko kesehatan mahasiswa. Sementara itu, tingkat kekhawatiran (anxiety) dan suasana hati (mood) juga berpengaruh, meskipun tidak sebesar sebelumnya. Atribut-atribut ini akan menentukan langkah yang diambil dalam pembelajaran mesin.
Untuk permasalahan klasifikasi seperti ini, tiga model akan diuji, yaitu Multinomial Logistic Regression, Random Forest, dan Support Vector Machines.
Untuk hasil yang konsisten dalam percobaan ini, digunakan seed tertentu untuk melakukan operasi.
# 1740812400 adalah 28 Februari 2025, 23:59:59 WIB
set.seed(1740812399)
Normalisasi data
new_data_just_numbers <- new_data |>
mutate_all(as.numeric)
new_data_just_numbers$Risk.Level <- new_data$Risk.Level
normalized_data_values <- new_data_just_numbers |>
preProcess(method = c("center", "scale"), rangeBounds = c(-1,1))
normalized_data <- predict(normalized_data_values, new_data_just_numbers)
Pembentukan dua data:
numeric_data <- normalized_data
selected_data <- normalized_data |>
select(
Risk.Level,
Attendance.Status,
Stress.Level..GSR.,
Anxiety.Level,
Mood.Score
)
Pembagian data ke dalam dua kelompok. Digunakan partisi yang sama untuk data lengkap dan data terpilih.
train_index <- createDataPartition(new_data$Risk.Level, p = 0.8, list = FALSE)
numeric_train_data <- numeric_data[train_index, ]
numeric_test_data <- numeric_data[-train_index, ]
selected_train_data <- selected_data[train_index, ]
selected_test_data <- selected_data[-train_index, ]
logit_model_numeric <- multinom(
Risk.Level ~ .,
data = numeric_train_data, trace = FALSE
)
logit_model_selected <- multinom(
Risk.Level ~ .,
data = selected_train_data, trace = FALSE
)
rf_model_numeric <- randomForest(
Risk.Level ~ .,
data = numeric_train_data,
ntree = 5,
mtry = 2
)
rf_model_selected <- randomForest(
Risk.Level ~ .,
data = selected_train_data,
ntree = 5,
mtry = 2
)
svm_model_numeric <- svm(
Risk.Level ~ .,
data = numeric_train_data, kernel = "radial"
)
svm_model_selected <- svm(
Risk.Level ~ .,
data = selected_train_data, kernel = "radial"
)
Model dievaluasi dengan dua kriteria: akurasi dan lama prediksi.
# Evaluate models with predictions
evaluate_model <- function(model, testData, model_name) {
# Measure the time taken to make the predictions
prediction_time <- system.time({
predictions <- predict(model, newdata = testData)
})['elapsed'] # Extract the elapsed time
# Calculate the confusion matrix
cm <- confusionMatrix(predictions, testData$Risk.Level)
# Extract the accuracy
accuracy <- cm$overall['Accuracy']
# Return a list including the model name, accuracy, model object, and prediction time
return(list(
ModelName = model_name,
Accuracy = accuracy,
PredictionTime = prediction_time,
ModelObject = model
))
}
# Initialize results data frame
results <- list(
evaluate_model(
logit_model_numeric, numeric_test_data, "MLR (All Fields)"
),
evaluate_model(
logit_model_selected, selected_test_data, "MLR (Selected Fields)"
),
evaluate_model(
rf_model_numeric, numeric_test_data, "RF (All Fields)"
),
evaluate_model(
rf_model_selected, selected_test_data, "RF (Selected Fields)"
),
evaluate_model(
svm_model_numeric, numeric_test_data, "SVM (All Fields)"
),
evaluate_model(
svm_model_selected, selected_test_data, "SVM (Selected Fields)"
)
)
# Arcade-style million scoring multiplier
score_scale <- 1000000
# Convert results into a data frame for easier handling
results_df <- data.frame(
Model = sapply(results, function(x) x$ModelName),
Accuracy = sapply(results, function(x) x$Accuracy * score_scale),
PredictionTime = sapply(results, function(x) x$PredictionTime * score_scale)
)
# Normalize accuracy and prediction time
results_df$NormAccuracy <-
results_df$Accuracy / max(results_df$Accuracy) * score_scale
results_df$NormPredictionTime <-
(max(results_df$PredictionTime) - (results_df$PredictionTime)) /
(max(results_df$PredictionTime) - min(results_df$PredictionTime)) *
score_scale
# Combine the metrics
accuracy_weight <- 0.9
predictiontime_weight <- 0.1
results_df$CompositeScore <-
(accuracy_weight * results_df$NormAccuracy) +
(predictiontime_weight * results_df$NormPredictionTime)
# Print results
results_df |>
kbl(digits = 0, caption = "Tabel Akurasi dan Waktu Prediksi Model") |>
kable_material()
| Model | Accuracy | PredictionTime | NormAccuracy | NormPredictionTime | CompositeScore |
|---|---|---|---|---|---|
| MLR (All Fields) | 797266 | 16000 | 797266 | 991770 | 816716 |
| MLR (Selected Fields) | 797266 | 12000 | 797266 | 1000000 | 817539 |
| RF (All Fields) | 997666 | 16000 | 997666 | 991770 | 997076 |
| RF (Selected Fields) | 1000000 | 14000 | 1000000 | 995885 | 999588 |
| SVM (All Fields) | 971991 | 498000 | 971991 | 0 | 874792 |
| SVM (Selected Fields) | 992998 | 117000 | 992998 | 783951 | 972093 |
Untuk evaluasi, \(R^2\) dan \(RMSE\) tidak bisa digunakan untuk soal klasifikasi, karena lebih cocok untuk masalah regresi.
# Visualize model accuracies
ggplot(results_df, aes(x = Model, y = Accuracy, fill = Model)) +
geom_bar(stat = "identity", position = position_dodge()) +
coord_cartesian(ylim = c(750000, 1000000)) +
labs(title = "Akurasi Model", y = "Accuracy", x = "Model")
# TODO change to log scale
# Visualize model accuracies
ggplot(results_df, aes(x = Model, y = PredictionTime, fill = Model)) +
geom_bar(stat = "identity", position = position_dodge()) +
coord_cartesian(ylim = c(1e+03, 2e+06)) +
scale_y_log10() +
labs(title = "Waktu Prediksi Model", y = "Prediction Time", x = "Model")
## [1] "Best Model: RF (Selected Fields)"
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
| Sens | Spec |
|
|
Prec | Recl | F1 | Prev | DetR | DetP | Accr | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Class: Low | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0.218073 | 0.218073 | 0.218073 | 1 |
| Class: Medium | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0.223074 | 0.223074 | 0.223074 | 1 |
| Class: High | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0.558853 | 0.558853 | 0.558853 | 1 |
| x | |
|---|---|
| Accuracy | 1.0000000 |
| Kappa | 1.0000000 |
| AccuracyLower | 0.9987707 |
| AccuracyUpper | 1.0000000 |
| AccuracyNull | 0.5588530 |
| AccuracyPValue | 0.0000000 |
| McnemarPValue | N/A |
sessionInfo()
## R version 4.4.2 (2024-10-31)
## Platform: x86_64-redhat-linux-gnu
## Running under: Fedora Linux 40 (Toolbx Container Image)
##
## Matrix products: default
## BLAS/LAPACK: FlexiBLAS OPENBLAS-OPENMP; LAPACK version 3.12.0
##
## locale:
## [1] LC_CTYPE=en_GB.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_GB.UTF-8 LC_COLLATE=en_GB.UTF-8
## [5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8
## [7] LC_PAPER=en_GB.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C
##
## time zone: Asia/Makassar
## tzcode source: system (glibc)
##
## attached base packages:
## [1] stats graphics grDevices datasets utils methods base
##
## other attached packages:
## [1] e1071_1.7-16 randomForest_4.7-1.2 nnet_7.3-20
## [4] caret_7.0-1 lattice_0.22-6 kableExtra_1.4.0
## [7] xtable_1.8-4 corrplot_0.95 ggpubr_0.6.0
## [10] insight_1.0.2 nortest_1.0-4 car_3.1-3
## [13] carData_3.0-5 moments_0.14.1 Hmisc_5.2-2
## [16] lubridate_1.9.4 forcats_1.0.0 stringr_1.5.1
## [19] dplyr_1.1.4 purrr_1.0.4 readr_2.1.5
## [22] tidyr_1.3.1 tibble_3.2.1 ggplot2_3.5.1
## [25] tidyverse_2.0.0
##
## loaded via a namespace (and not attached):
## [1] pROC_1.18.5 gridExtra_2.3 rlang_1.1.5
## [4] magrittr_2.0.3 compiler_4.4.2 systemfonts_1.2.1
## [7] vctrs_0.6.5 reshape2_1.4.4 crayon_1.5.3
## [10] pkgconfig_2.0.3 fastmap_1.2.0 backports_1.5.0
## [13] labeling_0.4.3 CoprManager_0.5.7 rmarkdown_2.29
## [16] prodlim_2024.06.25 tzdb_0.4.0 xfun_0.50
## [19] cachem_1.1.0 jsonlite_1.8.9 recipes_1.1.1
## [22] broom_1.0.7 parallel_4.4.2 cluster_2.1.8
## [25] R6_2.6.1 RColorBrewer_1.1-3 bslib_0.9.0
## [28] stringi_1.8.4 parallelly_1.42.0 rpart_4.1.24
## [31] jquerylib_0.1.4 Rcpp_1.0.14 bookdown_0.42
## [34] iterators_1.0.14 knitr_1.49 future.apply_1.11.3
## [37] base64enc_0.1-3 Matrix_1.7-2 splines_4.4.2
## [40] timechange_0.3.0 tidyselect_1.2.1 rstudioapi_0.17.1
## [43] abind_1.4-8 yaml_2.3.10 timeDate_4041.110
## [46] codetools_0.2-20 listenv_0.9.1 plyr_1.8.9
## [49] withr_3.0.2 evaluate_1.0.3 foreign_0.8-88
## [52] future_1.34.0 survival_3.8-3 proxy_0.4-27
## [55] xml2_1.3.6 pillar_1.10.1 stats4_4.4.2
## [58] checkmate_2.3.2 foreach_1.5.2 generics_0.1.3
## [61] hms_1.1.3 munsell_0.5.1 scales_1.3.0
## [64] globals_0.16.3 class_7.3-23 glue_1.8.0
## [67] tools_4.4.2 data.table_1.16.4 ModelMetrics_1.2.2.2
## [70] gower_1.0.2 ggsignif_0.6.4 cowplot_1.1.3
## [73] grid_4.4.2 ipred_0.9-15 colorspace_2.1-1
## [76] nlme_3.1-167 htmlTable_2.4.3 Formula_1.2-5
## [79] cli_3.6.4 viridisLite_0.4.2 svglite_2.1.3
## [82] lava_1.8.1 gtable_0.3.6 rstatix_0.7.2
## [85] sass_0.4.9 digest_0.6.37 farver_2.1.2
## [88] htmlwidgets_1.6.4 htmltools_0.5.8.1 lifecycle_1.0.4
## [91] hardhat_1.4.1 MASS_7.3-64